草庐IT

C++ union 与 reinterpret_cast

全部标签

c++ - 访问类内的 union 中的变量

很抱歉在C++中提出天真的问题。对于下面的代码,有一个类,其中有一个具有两个变量的union声明。如何使用以下代码中的类对象访问union中的变量:classmy{public://classmemberfunctions,andoepratoroverloadedfunctionspublic:unionuif{unsignedinti;floatf;};private://someclassspecificvariables.};如果有一个我定义的类型的对象myv1;稍后在函数中使用v1我如何访问floatf;在代码中上面的union内?我还想在调试器(VS-2010)的监wind

c++ - reinterpret_cast 本身会导致异常吗?

假设我有一个名为A的类和一个空指针vp。以下是否会导致异常?A*ap=reinterpret_cast(vp);谢谢,飞悦 最佳答案 不,都不是reinterpret_cast其C风格的转换等价物也不会执行任何检查,因此它们本身不会导致异常。显然,由于这两种构造都尽可能不安全,因此取消引用结果指针ap可能导致未定义的行为。 关于c++-reinterpret_cast本身会导致异常吗?,我们在StackOverflow上找到一个类似的问题: https://s

C++: union 与按位运算符

我有两个char,我想将它们按位“拼接”在一起。例如:charc1=11;//00001011charc2=5;//00000101shortintsi=stitch(c1,c2);//0000101100000101所以,我首先尝试的是按位运算符:shortintstitch(charc1,charc2){return(c1但这不起作用:我得到一个short等于c2...(1)为什么?(但是:c1和c2在我的真实应用中是负数...也许这是问题的一部分?)所以,我的第二个解决方案是使用union:unionstUnion{struct{charc1;charc2;}shortintsi

c++ - static_cast wchar_t* 到 int* 或 short* - 为什么它是非法的?

在MicrosoftVC2005和g++编译器中,以下会导致错误:在win32VC2005上:sizeof(wchar_t)为2wchar_t*foo=0;static_cast(foo);结果errorC2440:'static_cast':cannotconvertfrom'wchar_t*'to'unsignedshort*'...在MacOSX或Linuxg++上:sizeof(wchar_t)为4wchar_t*foo=0;static_cast(foo);结果error:invalidstatic_castfromtype'wchar_t*'totype'unsignedi

c++ - "cast"指向 C++ 中函数指针的成员函数指针的最简单方法是什么?

我想为STL算法的“comp”参数提供一个成员函数,例如lower_bound(...,Comparecomp)。comp()函数访问非静态成员字段,因此它本身必须是非静态成员,但非静态成员函数指针的类型与普通函数指针的类型不同。解决这个问题的最佳方法是什么? 最佳答案 这是std::mem_fun和std::mem_fun_ref最常见的用法。它们是创建调用指定成员函数的仿函数的模板。TR1添加了一个std::tr1::bind,它也很有用且用途更广(如果您没有可用的TR1,那是基于Boost::bind的)。C++0x将在标准库

c++ - c 中的 union 一次存储一个数据

如果在内存中分配的union大小等于以字节为单位的最大数据类型成员,那么谁能告诉我编译器如何存储和获取两个数据doubled和inti(总共8+4个字节)(doubleonmy机器是8个字节)。#includeuniontest{inti;doubled;};intmain(){uniontestobj;obj.d=15.5;obj.i=200;printf("\nValuestoredindis%f",obj.d);printf("\nValuestorediniis%d",obj.i);printf("\nsizeofobjis%d",sizeof(obj));}**Outputi

C++ strict-aliasing agnostic cast

我在StackOverflow中阅读了很多关于严格别名的QA,但它们都很常见,而且讨论总是倾向于引用C++标准的深层细节,这些细节几乎总是难以正确理解。特别是当标准不直接说,而是用一种含糊不清的方式描述某些东西时。所以,我的问题可能与这里的大量QA重复,但是请只回答一个具体问题:做一个“nonalias_cast”是正确的方法吗?:templateinlineautononalias_cast(IN*data){char*tmp=reinterpret_cast(data);returnreinterpret_cast(tmp);}floatf=3.14;unsigned*u=nona

c++ - "dynamic_cast"之后的 NULL 指针实际上可以取消引用吗?

以下代码编译正确并得到神秘的输出:specialInvestmentfunction00000000(环境:C++VS2010)#include#includeusingnamespacestd;classSecurity{public:virtual~Security(){}};classStock:publicSecurity{};classInvestment:publicSecurity{public:voidspecial(){cout(p)->special();cout(p)怎么可能呢?取消引用NULL指针并获得“正确”输出而不是崩溃?是VS2010的特殊“特性”吗?现在

c++ - 由 float : completely insane output 组成的 union 体

#includeunionNumericType{floatvalue;intintvalue;}Values;intmain(){Values.value=1094795585.00;printf("%f\n",Values.value);return0;}这个程序输出为:1094795648.000000谁能解释为什么会这样?为什么floatValues.value的值增加了?或者我在这里遗漏了什么? 最佳答案 首先,这与union的使用没有任何关系。现在,假设你写:intx=1.5;printf("%d\n",x);会发生什么

javascript - 将 JS 数字数组传递给 emscripten C++ 而无需 reinterpret_cast

我在JS中有大量数组,我想将其传递给C++进行处理。恕我直言,最有效的方法是让JS直接写入C++堆并在直接调用中将指针作为参数传递,例如:varsize=4096,BPE=Float64Array.BYTES_PER_ELEMENT,buf=Module._malloc(size*BPE),numbers=Module.HEAPF64.subarray(buf/BPE,buf/BPE+size),i;//Populatethearrayandprocessthenumbers:parseResult(result,numbers);Module.myFunc(buf,size);处理数